/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedbean;

import applicationexcepcion.AccountRegistratoException;
import applicationexcepcion.AddettoNegozioException;
import applicationexcepcion.AmministratoreExeption;
import applicationexcepcion.ClienteCodiceFiscaleNullException;
import applicationexcepcion.ClienteNonValidoException;
import applicationexcepcion.ClienteNullException;
import applicationexcepcion.PersonaRegistrataException;
import common.Stato;
import ejb.registrazione.RegistrazioneLocal;
import entity.Account;
import entity.AddettoNegozio;
import entity.Amministratore;
import java.sql.Date;
import java.util.GregorianCalendar;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import utility.ExceptionThrower;
import utility.ResourceBundleLoader;

/**
 *
 * @author Carmela
 */
public class Registrazione {
    
    @EJB
    private RegistrazioneLocal registrazione;
    
    private String nome;
    private String cognome;
    private String codiceFiscale;
    private String numeroTelefono;
    private Date dataNascita;
    private String email;
    private String password;
    private String via;
    private boolean accettoTermini;

    /**
     * Get the value of accettoTermini
     *
     * @return the value of accettoTermini
     */
    public boolean isAccettoTermini() {
        return accettoTermini;
    }

    /**
     * Set the value of accettoTermini
     *
     * @param accettoTermini new value of accettoTermini
     */
    public void setAccettoTermini(boolean accettoTermini) {
        this.accettoTermini = accettoTermini;
    }

    /**
     * Get the value of dataNascita
     *
     * @return the value of dataNascita
     */
    public Date getDataNascita() {
        return dataNascita;
    }

    /**
     * Set the value of dataNascita
     *
     * @param dataNascita new value of dataNascita
     */
    public void setDataNascita(Date dataNascita) {
        this.dataNascita = dataNascita;
    }

    /**
     * Get the value of via
     *
     * @return the value of via
     */
    public String getVia() {
        return via;
    }

    /**
     * Set the value of via
     *
     * @param via new value of via
     */
    public void setVia(String via) {
        this.via = via;
    }

    /**
     * Get the value of password
     *
     * @return the value of password
     */
    public String getPassword() {
        return password;
    }

    /**
     * Set the value of password
     *
     * @param password new value of password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Get the value of email
     *
     * @return the value of email
     */
    public String getEmail() {
        return email;
    }

    /**
     * Set the value of email
     *
     * @param email new value of email
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * Get the value of numeroTelefono
     *
     * @return the value of numeroTelefono
     */
    public String getNumeroTelefono() {
        return numeroTelefono;
    }

    /**
     * Set the value of numeroTelefono
     *
     * @param numeroTelefono new value of numeroTelefono
     */
    public void setNumeroTelefono(String numeroTelefono) {
        this.numeroTelefono = numeroTelefono;
    }

    /**
     * Get the value of codiceFiscale
     *
     * @return the value of codiceFiscale
     */
    public String getCodiceFiscale() {
        return codiceFiscale;
    }

    /**
     * Set the value of codiceFiscale
     *
     * @param codiceFiscale new value of codiceFiscale
     */
    public void setCodiceFiscale(String codiceFiscale) {
        this.codiceFiscale = codiceFiscale;
    }

    /**
     * Get the value of cognome
     *
     * @return the value of cognome
     */
    public String getCognome() {
        return cognome;
    }

    /**
     * Set the value of cognome
     *
     * @param cognome new value of cognome
     */
    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    /**
     * Get the value of nome
     *
     * @return the value of nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * Set the value of nome
     *
     * @param nome new value of nome
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * Metodo utilizzato per registrare il cliente
     *
     * @param provComSel
     * @return Successo o Errore
     */
    public String registra(ProvinciaComuni provComSel) {
        FacesContext fc = FacesContext.getCurrentInstance();
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(fc);
        if (!accettoTermini) {
            ExceptionThrower.throwMessageError(fc, rb, "registrazioneAccettoTerminiM");
            return "";
        }
        try {
            registrazione.registraCliente(nome, cognome, codiceFiscale, dataNascita, numeroTelefono,
                    provComSel.getComune(), via, email, password);
        } catch (PersonaRegistrataException ex) {
            ExceptionThrower.throwMessageError(fc, rb, "registrazionePersonaRegistrataM");
            return "";
        } catch (ClienteNullException ex) {
            ExceptionThrower.throwMessageError(fc, rb, "registrazionePersonaRegistrataM");
            return "";
        } catch (ClienteCodiceFiscaleNullException ex) {
            ExceptionThrower.throwMessageError(fc, rb, "registrazionePersonaRegistrataM");
            return "";
        } catch (ClienteNonValidoException ex) {
            ExceptionThrower.throwMessageError(fc, rb, "registrazionePersonaRegistrataM");
            return "";
        } catch (AccountRegistratoException ex) {
            ExceptionThrower.throwMessageError(fc, rb, "registrazioneAccountRegistratoM");
            return "";
        }finally{
            HttpSession session=(HttpSession) fc.getExternalContext().getSession(false);
        }
        
        return "SuccessoRegistrazione";
    }

    public Registrazione() {
    }

    public void registraAddettoNegozio(ProvinciaComuni pc) {
        FacesContext fc = FacesContext.getCurrentInstance();
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(fc);
        AddettoNegozio an = new AddettoNegozio();
        Account a = new Account();
        a.setDataRegistrazione(new Date(new GregorianCalendar().getTimeInMillis()));
        //TODO
        a.setStato(Stato.Attivo);
        a.setEmail(email);
        a.setPassword(password);
        an.setAccount(a);
        an.setNome(nome);
        an.setCognome(cognome);
        an.setCodiceFiscale(codiceFiscale);
        an.setDataDiNascita(dataNascita);
        an.setNumeroDiTelefono(numeroTelefono);
        an.setNegozio(pc.getNegozio());
        try {
            registrazione.registraAddettoNegozio(an);
            ExceptionThrower.throwMessageInfo(fc, rb, "regAddettoInfo");
        } catch (AddettoNegozioException ex) {
            Logger.getLogger(Registrazione.class.getName()).log(Level.SEVERE, null, ex);
            ExceptionThrower.throwMessageError(fc, rb, "regAddettoError");
        }
    }
    
    public void registraAmministratore(){
        FacesContext fc = FacesContext.getCurrentInstance();
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(fc);
        Amministratore am=new Amministratore();
        Account a = new Account();
        a.setDataRegistrazione(new Date(new GregorianCalendar().getTimeInMillis()));
        //TODO
        a.setStato(Stato.Attivo);
        a.setEmail(email);
        a.setPassword(password);
        am.setNome(nome);
        am.setCognome(cognome);
        am.setCodiceFiscale(codiceFiscale);
        am.setDataDiNascita(dataNascita);
        am.setNumeroDiTelefono(numeroTelefono);
        am.setAccount(a);
        try {
            registrazione.registraAmministratore(am);
            ExceptionThrower.throwMessageInfo(fc, rb, "regAmministartoreInfo");
        } catch (AmministratoreExeption ex) {
            Logger.getLogger(Registrazione.class.getName()).log(Level.SEVERE, null, ex);
            ExceptionThrower.throwMessageError(fc, rb, "regAmministratoreError");
        }
    }

    @PostConstruct
    public void init() {
        FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    }
}
